﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

//⼆维数组传参的本质
//void Test1(int (*ps) [3], int x, int y) {
//	for (int i = 0; i < x; i++) {
//		for (int j = 0; j < y; j++) {
//			printf("%d ",*( * (ps + i) + j));
//		}
//		printf("\n");
//	}
//}
//
//int main() {
//	int arr[3][5] = { {1,2,3,4,5} ,{2,3,4,5,6}, {3,4,5,6,7} };
//	Test1(arr, 3, 5);
//	return 0;
//}

//函数指针变量的创建
//int Add(int x, int y) {
//	return x + y;
//}
//
//void Test2() {
//	printf("hehe");
//}
//int main() {
//	int (*ps3)(int, int) = Add;
//	int (*ps4)(int x, int y) = &Add;
//	void (*ps1)() = Test2;   //&Test2 也可以
//	void (*ps2)() = &Test2;
//	printf("test  = %p\n", Test2);
//	printf("&test = %p\n", &Test2);
//	return 0;
//}

//通过函数指针调⽤指针指向的函数
//int Add(int x, int y) {
//	return x + y;
//}
//
//int main() {
//	int (*p)(int, int) = Add;
//	printf("%d\n", (*p)(2, 3));
//	printf("%d\n", p(3, 3));
//	return 0;
//}

//int main() {
//	(*(void (*) () ) 0)(); 
//	//(void(*)()为函数指针类型,
//	//(void(*)()0为强制类型转换，将0从int转为函数指针类型
//	//(*(void(*)()0)()为调用函数。
//	return 0;
//}

//int main() {
//	void (*signal(int, void(*)(int)))(int);
//	//signal为函数名，
//	//signal(int, void (*)(int))为函数调用，其中参数包含一个整形和一个函数指针。
//	//可变化为 void(*)(int) signal(int, void (*)(int))，signal的返回类型是函数指针，其指向参数为整形。
//	return 0;
//}

//typedef 是⽤来类型重命名的，可以将复杂的类型，简单化。
//typedef unsigned int unit;
//typedef char tint;
//typedef int* pr_w;
//typedef int(*pr_t)[5];
//
//int arr[] = { 1,2,3,4 };
//unit a = 20;
//tint b = 'c';
//pr_w d = &a;
//int (*p)[5] = &arr;
//pr_t p = &arr;
//
//typedef void(*prr_w)(int);
//void (*signal(int, void(*)(int)))(int);
//prr_w signal(int ,prr_w);   //可简化为如下写法

//函数指针数组
/*int (*p[3])();  *///基本定义。

//转移表
//计算器的⼀般实现：
//void meun() {
//	printf("******************\n");
//	printf("***1.Add  2.Sub***\n");
//	printf("***3.Mul  4.Div***\n");
//	printf("***** 0.Exit *****\n");
//	printf("******************\n");
//	printf("请输入：< ");
//}
//int Add(int x, int y) {
//	return x + y;
//}
//int Sub(int x, int y) {
//	return x - y;
//}
//int Mul(int x, int y) {
//	return x * y;
//}
//int Div(int x, int y) {
//	return x / y;
//}
//
//int main() {
//	int x = 0;
//	int y = 0;
//	int ret = 0;
//	int input = 0;
//	do {
//		meun();
//		scanf("%d", &input);
//		switch (input) {
//		case 0:
//			printf("退出计算器。");
//		case 1:
//			printf("请输入两个整数：");
//			scanf("%d %d", &x, &y);
//			ret = Add(x, y);
//			printf("%d\n", ret);
//			break;
//		case 2:
//			printf("请输入两个整数：");
//			scanf("%d %d", &x, &y);
//			ret =Sub(x, y);
//			printf("%d\n", ret);
//			break;
//		case 3:
//			printf("请输入两个整数：");
//			scanf("%d %d", &x, &y);
//			ret = Mul(x, y);
//			printf("%d\n", ret);
//			break;
//		case 4:
//			printf("请输入两个整数：");
//			scanf("%d %d", &x, &y);
//			ret = Div(x, y);
//			printf("%d\n", ret);
//			break;
//		default:
//			printf("输入错误，请重新输入!\n");
//			break;
//		}
//	} while (input);
//	return 0;
//}

//使⽤函数指针数组的实现：
//void meun() {
//	printf("******************\n");
//	printf("***1.Add  2.Sub***\n");
//	printf("***3.Mul  4.Div***\n");
//	printf("***** 0.Exit *****\n");
//	printf("******************\n");
//	printf("请输入：< ");
//}
//int Add(int x, int y) {
//	return x + y;
//}
//int Sub(int x, int y) {
//	return x - y;
//}
//int Mul(int x, int y) {
//	return x * y;
//}
//int Div(int x, int y) {
//	return x / y;
//}
//
//int main() {
//	int(*p[5])(int, int) = {0,Add,Sub,Mul,Div};
//	int x = 0;
//	int y = 0;
//	int ret = 0;
//	int input = 0;
//	do {
//		meun();
//		scanf("%d", &input);
//		if (input >= 1 && input <= 4) {
//			printf("请输入两个整数：");
//			scanf("%d %d", &x, &y);
//			ret = (*p[input])(x, y);
//			printf("%d\n", ret);
//		}
//		else if (input == 0)
//			printf("退出计算器");
//		else
//			printf("输入有误，请重新输入！\n");
//		
//	} while (input);
//	return 0;
//}



//使用回调函数进行改造
//void meun() {
//	printf("******************\n");
//	printf("***1.Add  2.Sub***\n");
//	printf("***3.Mul  4.Div***\n");
//	printf("***** 0.Exit *****\n");
//	printf("******************\n");
//	printf("请输入：< ");
//}
//int Add(int x, int y) {
//	return x + y;
//}
//int Sub(int x, int y) {
//	return x - y;
//}
//int Mul(int x, int y) {
//	return x * y;
//}
//int Div(int x, int y) {
//	return x / y;
//}
//
//void Cucl(int (* p)(int, int)) {
//	int x = 0;
//	int y = 0;
//	int ret = 0;
//	printf("请输入两个整数：");
//	scanf("%d %d", &x, &y);
//	ret = p(x, y);
//	printf("%d\n", ret);
//
//}
//
//int main() {
//	int x = 0;
//	int y = 0;
//	int ret = 0;
//	int input = 0;
//	do {
//		meun();
//		scanf("%d", &input);
//		switch (input) {
//		case 0:
//			printf("退出计算器。\n");
//		case 1:
//			Cucl(Add);
//			break;
//		case 2:
//			Cucl(Sub);
//			break;
//		case 3:
//			Cucl(Mul);
//			break;
//		case 4:
//			Cucl(Div);
//			break;
//		default:
//			printf("输入错误，请重新输入!\n");
//			break;
//		}
//	} while (input);
//	return 0;
//}


//一个数组中只有两个数字是出现一次，其他所有数字都出现了两次。
//编写一个函数找出这两个只出现一次的数字。
//void FindNum(int arr[], int* pr, int* ps,int len) {
//	int tmp = 0;
//	for (int i = 0; i < len; i++) {
//		tmp ^= arr[i];
//	}
//	int pos = 0;
//	for (int i = 0; i < 32; i++) {
//		if ((tmp >> i) & 1 == 1) {
//			pos = i;
//			break;
//		}
//	}
//	for (int i = 0; i < len; i++) {
//		if ((arr[i] >> pos) & 1 == 1) {
//			*pr ^= arr[i];
//		}
//		else
//			*ps ^= arr[i];
//	}
//}
//
//int main() {
//	int a = 0;
//	int b = 0;
//	int arr[] = { 1,2,3,4,5,1,2,3,4,6 };
//	int len = sizeof(arr) / sizeof(arr[0]);
//	FindNum(arr, &a, &b,len);
//	printf("%d %d", a, b);
//	return 0;
//}

//BC54  获得月份天数
int main() {
	int year = 0;
	int m = 0;
	scanf("%d %d", &year, &m);
	int days[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
	int day = days[m - 1];
	if ((year % 4 == 0 && year % 100 != 0) || year % 4 == 0) {
		if (m == 2)
			day += 1;
	}
	printf("%d", day);
	return 0;
}